/**
 *<br><br>
 * @desc 节流：返回一个被闭包控制的函数来限制我们传递fn（目标函数）的执行频率
 * @param {function} fn  目标函数
 * @param {number} wait  等待时间毫秒
 * @param {boolean} [immediate=false]   是否立即执行。default: false
 * @return {function}
 */
function throttle(
  fn: (...args: any[]) => void,
  wait: number,
  immediate?: boolean
): (...args: any[]) => void {
  let timer: NodeJS.Timeout | null = null
  // let context: any
  return function (this: any, ...args: any[]) {
    if (!timer) {
      if (immediate) {
        fn.apply(this, args)
      }
      // 开始一个新周期
      timer = setTimeout(() => {
        if (!immediate) {
          fn.apply(this, args)!
        }
        // 周期结束
        timer && clearTimeout(timer)
        timer = null
      }, wait)
    }
  }
}

export default throttle
